BLOCKBST.BAS - Blockbuster by Charles Roslund (Jan 1982 Chromasette, written in 1981).

  EOB peek(27-28) points to $302A (I think this is end of the program loaded, in this case the ML code is hidden at the end with this address being the last byte
start of ML (which appears to be $2B0 bytes) is $2D7A. So code/data for the ML portion is 688 bytes

It looks to be set up as position independent (at least for the most part).
NOTE: I don't claim that this disassembly is 100% accurate, either in code or comments. I did enough to figure out what needed changing to be able to run it from disk.

Bolded lines are the lines that needed changing for disk.

2D7A	LBRA	$2FA7			Jump to main program

* Couple of 8x4 pixel shapes (4 color)
2D7D	FDB	$82AA			8 pixel x 4 line graphics shape
	FDB   $00AA
	FDB   $00AA
	FDB	$82AA

2D85	FDB	$A82A			8 pixel x 4 line graphics shape
	FDB	$A00A
	FDB	$A00A
	FDB	$A82A

* Data area
2D8D	FCB	$00			Counter related to joysticks
2D8E	FCB	$2F			Something with right joystick X axis
2D8F	FCB	$00			Flag byte ($00 or $FF)
2D90	FDB	$1148			Address ptr for something on screen ($1948)
2D92	FCB	$FF			Possibly another flag byte (having to do with screen)
2D93	FCB	$00			Counter of some sort
2D94  FDB   $0046			Score of some sort (70) returned to BASIC program from USR0 call
2D96	FCB 	$00			Counter of some sort
2D97	FDB   $1148			PTR ON SCREEN FOR SOMETHING ($1948)
2D99	FDB	$AAAA			copy of 8 pixels 3 lines down from current Y screen ptr for something
2D9B	FCB	13			game level (used for length of a time delay)
2D9C	FCB	$01			Copy of 8 bit counter @ $@2D9D
2D9D	FCB	$01			8 bit counter

* Subroutines and code area
2D9E	JSR	[$A00A]		Read joysticks
2DA2	LDA	-$18,PC		Get counter from $2D8D
2DA5	BEQ	$2DAA			If 0 skip ahead
2DA7	DEC	-$1D,PC		Dec counter @ $2D8D
2DAA	LDA	#1
2DAC	CMPA	-$22,PC		Is that counter a 1? ($2D8D)
2DAF	BNE	$2DE2
2DB1	LDA	>$015A		Get right joystick X value
2DB4	CMPA	-$29,PC		$2D8E
2DB7	BEQ	$2DE2			If same skip ahead
2DB9	BLT	$2DD1			If joystick right of value, skip ahead
2DBB	LDA	-$2F,PC		$2D8F
2DBE	BNE	$2DD1
2DC0	LDA	-$26,PC		Get counter from $2D9D
2DC3	CMPA	#5
2DC5	BEQ	$2DCC
2DC7	INC	-$2D,PC		Inc counter @ $2D9D
2DCA	BRA	$2DE2

2DCC	COM	-$40,PC		Invert bits @ $2D8F
2DCF	BRA	$2DE2

2DD1	LDA	-$37,PC		Get counter value from $2D9D
⁃	2DD4	BEQ	$2DE2			If 0 skip ahead
2DD6	DEC	-$3C,PC		>0, dec the counter @ $2D9D
2DD9	BRA	$2DE2			And skip ahead

2DDB	LDA	-$4F,PC		Get $2D8F
2DDE	BEQ	$2DD1			If 0 dec counter @ $2D9D (unless it is 0 as well)
2DE0	BRA	$2DC0			<>0, check if counter @ $2D9D is 5

2DE2	LDD	#$AA			color 2, 8 pixels
2DE5	LDX	#$1080		I THINK THIS IS A HARDCODE BASE SCREEN ADDRESS? ($1880)
2DE8	STD	,X++			Save on screen
2DEA	CMPX	#$10C0		SEE IF DONE - SCREEN ADDRESS ($18C0)
2DED	BLT	$2DE8			Keep filling with color 2 until done
2DEF	LDA	$015A			Get right joystick X value
2DF2	LSRA				Divide by 2 (for horizontal byte offset)
2DF3	CMPA	#28			check if >=28 (move right)
2DF5	BLT	$2DF9			No, skip ahead
2DF7	LDA	#28			Yes, force to 28
2DF9	TFR	A,B			Copy to B for ABX
2DFB	LDX	#$1080		HARD CODED SCREEN ADDRESS ($1880)
2DFE	ABX				Add X position
2DFF	LDA	#2			Counter of how many 8 pixel chunks to clear to color 0 for 2 lines
2E01	LDY	#0
2E05	STY	$20,X			Save 8 pixels of color 0 one line down
2E09	STY	,X++			And on current line, and point 8 pixels to right
2E0C	DECA				Dec # of 8 pixel chunks counter
2E0D	BNE	$2E05			Do until 16 pixels/4 bytes x 2 are cleared to color 0
2E0F	RTS

2E10	LDA	>-$0082,PC		$2D92
2E14	BEQ	$2E23			If 0 skip ahead
2E16	LDD	#32			? Length of screen line maybe?
2E19	ADDD	>-$0086,PC		$2D97 Add to location
2E1D	STD	>-$008A,PC		$2D97 And save updated location
2E21	BRA	$2E2E			Skip ahead

2E23	LDD	#-32			$FFE0 (size of one line going up)
2E26	ADDD	>-$0093,PC		$2D97 move screen location up one line
2E2A	STD	>-$0097,PC		$2D97 and save new location
2E2E	LDA	>-$0096,PC		$2D9C
2E32	BEQ	$2E3A			If already 0 skip ahead
2E34	DEC	>-$009C,PC		$2D96 Otherwise dec value
2E38	BRA	$2E70			and skip way ahead

2E3A	LDA	>-$00A1,PC		$2D9D Copy to $2D9C
2E3E	STA	>-$00A6,PC		$2D9C
2E42	LDA	>-$00B7,PC		$2D8F
2E46	BEQ	$2E5B
2E48	LDA	>-$00B6,PC		$2D96
2E4C	BEQ	$2E6C
2E4E	LDD	#1
2E51	ADDD	>-$00BE,PC		$2D97
2E55	STD	>-$00C2,PC		$2D97
2E59	BRA	$2E6C

2E5B	LDA	>-$00C9,PC		$2D96
2E5F	BNE	$2E6C
2E61	LDD	#-1
2E64	ADDD	>-$00D1,PC		$2D97 Subtract 1 and save it back
2E68	STD	>-$00D5,PC		$2D97
2E6C	COM	>-$00DA,PC		$2D8E
2E70	LDA	>-$00E2,PC		$2D92
2E74	BEQ	$2E83
2E76	LDX	>-$00E3,PC		$2D97
2E7A	LDD	$60,X			?Get 8 pixels from 3 lines down?
2E7D	STD	>-$00E8,PC		$2D99 Save them
2E81	BRA	$2E8B

2E83	LDX	[>-$00F0,PC]	Get address from [$2D97]
2E87	STX	>$00F2,PC		$2D99
2E8B	LDY	#$AAAA		8 pixels of color 2
2E8F	LDX	>-$0103,PC		$2D90 Get address on screen
2E93	LDA	#4			4 lines of 8 pixels to draw in color 2
2E95	STY	,X			Save 8 pixels of color 2
2E98	LEAX	$20,X			Move down 1 line
2E9B	DECA				Dec line counter
2E9C	BNE	$2E95			Finish all 4 lines
2E9E	CLRB
2E9F	LDA	>-$010D,PC		$2D96
2EA3	BEQ	$2EA7
2EA5	LDB	#8
2EA7	LEAX	>-$012E,PC		Point to $2D7D (graphics shape)
2EAB	LDA	#4
2EAD	LDY	>-$011B,PC		$2D97 (Screen address to write to)
2EB2	LDU	B,X			Get 2 bytes/8 pixels form graphics shape
2EB4	LEAX	2,X			And bump source copy pointer up by 2
2EB6	STU	,Y			Save 8 pixels on screen
2EB8	LEAY	$20,Y			Move one line down
2EBB	DECA				Dec lines right counter
2EBC	BNE	$2EB2			Keep going until all 4 lines done
2EBE	LDX	>-$12B,PC		$2D97
2EC2	STX	>-$136,PC		$2D90
2EC6	RTS

2EC7	LDD	>-$13B,PC		$2D90
2ECB	ANDB	#$1F			Zero out high 3 bits
2ECD	BNE	$2EE2			If result still <>0 then skip ahead
2ECF	LDA	#$FF
2ED1	STA	>-$146,PC		$2D8F
2ED5	LDA	>-$13D,PC		$2D9C
2ED9	CMPA	>-$140,PC		$2D9D
2EDD	BNE	$2EE2
2EDF	LBSR	$2FEE			Something with PIA's
2EE2	CMPB	#$1F			31
2EE4	BNE	$2EF7
2EE6	CLR	>-$15B,PC		$2D8F
2EEA	LDA	>-$152,PC		$2D9C
2EEE	CMPA	>-$155,PC		$2D9D
2EF2	BNE	$2EF7
2EF4	LBSR	$2FEE			Something with PIA's (could have been LBRA)
2EF7	RTS

2EF8	LDD	>-$16C,PC		$2D90 Get ptr to something on screen
2EFC	CMPD	#$0640		4th line on screen or lower? (HARDCODE ADDRESS) ($0E40)
2F00	BGE	$2F0B			Yes, skip ahead
2F02	LDA	#$FF			No, set screen related flag byte to $FF
2F04	STA	>-$176,PC		$2D92
2F08	LBSR	$2FEE			And do something with PIA's
2F0B	RTS

2F0C	LDD	>-$177,PC		$2D99 Get 8 pixels we save earlier
2F10	CMPA	#$55			First 4 pixels all color 1?
2F12	BEQ	$2F22			Yes, skip ahead
2F14	CMPA	#$FF			First 4 pixels all color 3?
2F16	BEQ	$2F22			Yes, skip ahead
2F18	CMPB	#$55			Last 4 pixels all color 1?
2F1A	BEQ	$2F22			Yes, skip ahead
2F1C	CMPB	#$FF			Last 4 pixels all color 3?
2F1E	BEQ	$2F22			Yes, skip ahead
2F20	BRA	$2F33			No, jump somewheres else (these 2 lines could be BNE $2F33 instead)

2F22	LDX	>-$192,PC		$2D94 Get score value (doesn't include 1's digit)
2F26	LEAX	1,X			Increase score by 1 (10 points in game)
2F28	STX	>-$198,PC		$2D94	And save it back
2F2C	COM	>-$19E,PC		$2D92 Flip screen related byte flag
2F30	LBSR	$2FEE			Do something with PIA's
2F33	RTS

2F34	LDD	>-$19F,PC		$2D99 Get 8 pixels we saved
2F38	CMPA	#0			(Could have been TSTA) 1st 4 pixels all color 0?
2F3A	BEQ	$2F41			Yes, skip ahead
2F3C	CMPB	#0			(Could have been TSTB) Last 4 pixels all color 0?
2F3E	BEQ	$2F41			Yes, skip ahead
2F40	RTS				No, return

2F41	LDA	#8
2F43	STA	>-$1BA,PC		$2D8D Set counter related to joystick to 8
2F47	COM	>-$1B9,PC		$2D92 Flip flag byte (related to screen)
2F4B	LDA	>$015A		Get right joystick X value
2F4E	STA	>-$1C4,PC		$1D8E
2F52	LBSR	$2FEE			Do something with PIA's
2F55	RTS

2F56	LDX	>-$1CA,PC		$2D90 Get ptr to location on screen
2F5A	CMPX	#$1140		HARDCODED SCREEN ADDRESS TO COMPARE TO ($1940)
2F5D	BGE	$2F60			If at position or lower on screen, skip ahead
2F5F	RTS				Otherwise return

2F60	DEC	>-$1D1,PC		$2D93 Dec counter
2F64	BNE	$2F67			More right, skip ahead
2F66	RTS				At 0, return

2F67	LDY	#$AAAA		8 pixels of color 2
2F6B	LDX	>-$1DF,PC		$2D90 Get ptr on screen to put them
2F6F	LDA	#4			line counter
2F71	STY	,X			Save 8 pixels on screen
2F74	LEAX	$20,X			Point to next line on screen
2F77	DECA				Dec line counter
2F78	BNE	$2F71			Do until all 4 lines done
2F7A	LDX	#$0EE2		I THINK THIS IS A HARDCODE BASE SCREEN ADDRESS? ($16E2)
2F7D	LDB	-$1EC,PC		Get value from $2D95 (horizontal position of some sort?)
2F81	ABX				Add to address
2F82	STX	-$1F6,PC		Save new address to $2D90
2F86	STX	-$1F3,PC		And to $2D97
2F8A	LDA	#2
2F8C	STA	-$1F3,PC		Save to $2D9D
2F90	CLR	-$1FE,PC		Clear $2D96
2F94	CLR	-$209,PC		Clear $2D9F
2F98	CLR	-$20A,PC		Clear $2D92
2F9C	LBSR	$2D9E
2F9F	LDA	$FF00
2FA2	ANDA	#$01
2FA4	BNE	$2F9C
2FA6	RTS

2FA7	JSR	$B3ED			Convert 5 byte FP value passed to us to 2 byte INTEGER, returned to us in D (Level)
2FAA	STB	-$213,PC		Save level # to $2D9B (1-15)
2FAE	LDA	#5
2FB0	STA	-$221,PC		Save 5 to 2D93
2FB4	CLRA
2FB5	CLRB
2FB6	STD	-$226,PC		Save $0000 to $2D94
2FBA	BSR	$2F7A
2FBC	LDA	-$22D,PC		Get the 5 we saved earlier from $2D93
2FC0	BNE	$2FC9			If <>0, continue
2FC2	LDD	-$232,PC		Otherwise get value from $2D94
2FC6	JMP	$B4F4			Convert 16 bit integer to 5 byte FP and return it to caller

2FC9	LDA	-$232,PC		Get level # from $2D9B (Used as delay timer MSB)
2FCD	BEQ	$2FD7			If level is 0 (no time delay), skip ahead
2FCF	LDB	#$FF			Time delay=255
2FD1	DECB				Dec delay counter
2FD2	BNE	$2FD1			Keep going until counter hits 0
2FD4	DECA				Dec MSB of time delay counter
2FD5	BNE	$2FCF			go do inner time delay loop again
2FD7	LBSR	$2D9E
2FDA	LBSR	$2E10
2FDD	LBSR	$2EC7
2FE0	LBSR	$2EF8
2FE3	LBSR	$2F0C
2FE6	LBSR	$2F34
2FE9	LBSR	$2F56
2FEC	BRA	$2FBC

2FEE	LDA	$FF01
2FF1	ANDA	#$F7			zero out 4th bit
2FF3	STA	$FF01
2FF6	LDA	$FF03
2FF9	ANDA	#$F7			zero out 4th bit
2FFB	STA	$FF03
2FFE	LDA	$FF23
3001	ORA	#$08			Set 4th bit
3003	STA	$FF23
3006	LDA	#$FC
3008	BSR	$3015
300A	SUBA	#4
300C	BNE	$3008
300E	BSR	$3015
3010	ADDA	#4
3012	BNE	$300E
3014	RTS

3015	STA	$FF20
3018	LDB	#$14			Loop counter of 20 for delay
301A	DECB
301B	BNE	$301A
301D	RTS

301E	FCB				0,0,0,0,0,0,0,0,0,0,0,0,0